En el JNDI, cada nombre se resuelve en relaci�n a un contexto. Para empezar, normalmente creamos un contexto inicial usando uno de los constructores de las clases InitialContext, InitialDirContext, o InitialLdapContext.
La lecci�n Propiedades de Entorno contiene ejemplos de c�mo usar estos constructores.
Una vez que tenemos un ejemplar de un Context, podemos buscar otros contextos y realizar operaciones de nombrado en relaci�n a esos contextos. Los nombres suministrados a todos esos contextos son nombres relativos. Es decir, son interpretados en relaci�n al contexto en el que suministraron.
Lo m�s cercano a un nombre absoluto en JNDI es un string URL. En JNDI, podemos suministrar un string URL a los m�todos de las clases InitialContext y InitialDirContext. (La clase InitialLdapContext no declara ning�n m�todo que acepte un argumento nombre, aunque hereda todos los m�todos de las clases InitialContext y InitialDirContext.)
�Vista de Cliente
Cuando suministramos un string URL, que es un string de la forma.
esquema: partes-espec�ficas-del-esquema
a un m�todo de InitialContext o InitialDirContext, como lookup(), el nombre es tratado como un string URL en vez de un nombre relativo al contexto inicial. Aqu� tenemos un ejemplo que busca un objeto usando un string URL LDAP.
Object obj = new InitialContext().lookup(
"ldap://localhost:389/cn=homedir,cn=Jon Ruiz,ou=People,o=jnditutorial");
La clase InitialContext (y sus subclases) desv�an la llamada a m�todo para que sea procesado por la correspondiente implementaci�n del contexto URL, en vez de la implementaci�n del contexto inicial subyacente.
Es decir, si hemos seleccionado la propiedad de entorno Context.INITIAL_CONTEXT_FACTORY, no habr�a sido usado en la llamada a lookup(). En su lugar, el JNDI hubiera buscado y utilizado la implementaci�n del contexto URL para el esquema URL ldap. Observa que en el ejemplo anterior no se especific� la propiedad Context.INITIAL_CONTEXT_FACTORY al constructor de InitialContext.
La habilidad del JNDI de aceptar strings URLs arbitrarias desde la clase InitialContext (y sus subclases) nos permite acceder a cualquier espacio de nombres en el que tengamos una implementaci�n. As�, no estamos restringidos por el espacio de nombres ofrecido por la implementaci�n nombrada por la propiedad Context.INITIAL_CONTEXT_FACTORY.
Por ejemplo, supongamos que nombramos un proveedor de servicios del sistema de ficheros usando la propiedad de entorno Context.INITIAL_CONTEXT_FACTORY.
Usando el mismo tiempo el ejemplar de InitialContext, podemos acceder a un espacio de nombres LDAP especificando un string URL LDAP y podemos acceder a un espacio de nombres CORBA especificando una string URL CORBA.
�C�mo se Procesan los Strings URL
Cuando la clase InitialContext recibe un string URL como un argumento nombre de uno de sus m�todos, busca una implementaci�n de contexto URL. Hace esto usando la propiedad de entorno Context.URL_PKG_PREFIXES.
Esta propiedad contiene una lista separada por dos puntos de prefijos de paquetes. Cada �tem de la lista es el prefijo de un paquete totalmente cualificado de una factor�a de contexto URL. El nombre de la factor�a se construye usando la siguiente regla.
prefijo-pquete. esquema. esquemaURLContextFactory
El prefijo de paquete "com.sun.jndi.url" siempre se a�ade al final de la lista.
Normalmente, un proveedor de servicio que suministra una implementaci�n de contexto tambi�n suministrar� una implementaci�n de contexto URL para que pueda manejar strings URLs pasadas al InitialContext. Sin embargo, no es obligatorio y algunos proveedores de servicios podr�an no suministrar implementanciones de contexto URL. Supongamos que la propiedad URL_PKG_PREFIXES contiene.
com.widget:com.wiz.jndi
Tambi�n supongamos que se suministra el siguiente string URL al m�todo lookup() de la clase InitialContext.
ldap://localhost:389/cn=homedir, cn=Jon Ruiz, ou=People, o=JNDITutorial
El JNDI buscar� las siguientes clases.
com.widget.ldap.ldapURLContextFactory com.wiz.jndi.ldap.ldapURLContextFactory com.sun.jndi.url.ldap.ldapURLContextFactory
Luego intentar� ejemplarizar cada clase por turno llamando a ObjectFactory.getObjectInstance(Object, Name, Context, Hashtable) hasta que una de ellas produzca una respuesta no-null. La respuesta, que es un contexto, se usa para llevar a cabo el m�todo originalmente intencionado, usando el string URL como argumento nombre.
Luego, supongamos que el JNDI ejemplariza satisfactoriamente la clase com.wiz.jndi.ldap.ldapURLContextFactory y obtiene un contexto desde ella. Luego el JNDI llama a lookup() sobre el contexto y le suministra "ldap://localhost:389/cn=homedir, cn=Jon Ruiz, ou=People, o=JNDITutorial" como el string del argumento nombre.
Si el JNDI no puede encontrar una factor�a de contexto URL que devuelva una respuesta no-null, se pasa el string URL de entrada a la implementaci�n del contexto inicial subyacente (es decir, la implementaci�n especificada en la propiedad de entorno Context.INITIAL_CONTEXT_FACTORY).
Puedes ir a la secci�n Construir un Proveedor de Servicio para ver descripciones de c�mo escribir una implementaci�n de un contexto URL.
�Relaciones con el Contexto Inicial Subyancente
Necesitamos entender que no existe relaci�n entre la implementaci�n nombrada por la propiedad de entorno Context.INITIAL_CONTEXT_FACTORY y cualquier otra implementaci�n de contexto URL distinta a todas las que se pueden encontrar mediante el mismo ejemplar de InitialContext.
Por ejemplo, supongamos, que tenemos la siguiente configuraci�n de propiedades de entorno.
java.naming.factory.initial=com.wiz.jndi.ldap.LdapContextFactory java.naming.factory.url.pkgs=
Si suministramso el nombre "ldap://localhost:389/o=JNDITutorial" a InitialContext.lookup(), la lista de clases de factor�as de contextos URL intentar� esto.
com.sun.jndi.url.ldap.ldapURLContextFactory
Si el proveedor de servicio viene con una factor�a de contextos URL, el proveedor suminstrar� un fichero de recursos de apliaci�n (jndi.properties) que contiene el prefijo del paquete de la factor�a. Puedes ir a la lecci�n Propiedades de Entorno para ver una descripci�n de los ficheros de recursos de aplicaci�n. Si el proveedor tiene una factor�a de contextos URL pero no ha especificado un prefijo de paquete para ella en el fichero de recursos de aplicaci�n, deber�amos especificarlo en nuestro programa o en el fichero de recursos de aplicaci�n para que el JNDI pueda encontrar la factor�a.
�Relaci�n con Nombres Mixtos
Para especificar un string URL como parte de un nombre mixto para los m�todos de InitialContext, la ponemos como el primer compomente de un nombre mixto. Haciendo esto, en efecto, usamos el string URL para nombrar un contexto en el que continuar la operaci�n sobre el resto de componentes del nombre.
Aqu� tenemos un ejemplo que crea un CompositeName que consiste en string URL LDAP como el primer componente y los nombres de ficheros de los componentes restantes.
String url =
"ldap://localhost:389/cn=homedir,cn=Jon Ruiz,ou=people,o=JNDITutorial";
// Create a CompositeName in which the first component is a URL string
Name name = new CompositeName().add(url);
// Add the other components
name.add("tutorial").add("report.txt");
// Perform the lookup by using CompositeName
System.out.println(ctx.lookup(name));
No podemos especificar un componentes de nombres mixtos como parte de un propio string URL porque haciendo esto podr�a tener un conflicto con la s�ntaxis URL.
�M�s que S�lo Nombres
Algunas URLs, como las del LDAP (RFC 2255), especifican m�s de un componente de nombre. La s�ntaxis URL de LDAP permite especificar el �mbito de b�squeda y la consulta de b�squeda, as� como los atributos a devolver. Puedes ir a la lecci�n Miscel�nea para ver m�s informaci�n y ejemplos de c�mo se usan los componentes de consultas en un string URL.